package com.witker.common.util;

import java.math.BigDecimal;
import java.text.ParsePosition;
import java.text.SimpleDateFormat;
import java.util.Collection;
import java.util.Date;
import java.util.Map;

/**
 * 判断空类型工具类
 * Created by BOCAI on 2018/9/16 9:19.
 */
public class NoneTypeUtil {

    /**
     * 空字符串,表示为null
     */
    public static final String STRING = null;
    /**
     * 空日期
     */
    public static final Date DATE= ( new SimpleDateFormat("yyyy-MM-dd")).parse("1900-01-01",new ParsePosition(0));
    /**
     * 空整数
     */
    public static final int INTEGER = Integer.MIN_VALUE ;
    /**
     * 空长整数
     */
    public static final long LONG = Long.MIN_VALUE;
    /**
     * 空单精度浮点数
     */
    public static final float FLOAT = Float.MIN_VALUE;
    /**
     * 空双精度浮点数
     */
    public static final double DOUBLE = Double.MIN_VALUE;
    /**
     * 布尔逻辑为假
     */
    public static final boolean BOOLEAN = false;
    /**
     * 空字节
     */
    public static final byte BYTE = Byte.MIN_VALUE;

    /**
     * 空的Decimal
     */
    public static final BigDecimal DECIMAL = null;
    /**
     * 空的字节数组
     */
    public static final byte[] BYTES = null ;

    /**
     * 判断字符串对象是否为空
     * @param strValue 判断的值
     * @return 对象为空返回true,否则返回false
     */
    public static boolean isNull( String strValue){
        if(strValue == null ||strValue.equals(NoneTypeUtil.STRING))
            return true ;
        return false ;
    }

    /**
     * 判断被指定的int类型数据是否为空,为空的条件为：NoneTypeUtil.INTEGER
     * @param data 判断的值
     * @return 如果为空返回true,否则返回false
     */
    public static boolean isNull(int data){
        if (data == NoneTypeUtil.INTEGER)
            return true;
        return false;
    }

    /**
     * 判断被指定的boolean类型数据是否为空,为空的条件为：NoneTypeUtil.BOOLEAN
     * @param data 判断的值
     * @return 如果为空返回true,否则返回false
     */
    public static boolean isNull(boolean data){
        if (data == NoneTypeUtil.BOOLEAN)
            return true;
        return false;
    }

    /**
     * 判断被指定的long类型数据是否为空,为空的条件为： NoneTypeUtil.LONG
     * @param data 判断的值
     * @return 如果为空返回true,否则返回false
     */
    public static boolean isNull( long data){
        if (data == NoneTypeUtil.LONG)
            return true;
        return false;
    }
    /**
     * 判断被指定的byte类型数据是否为空,为空的条件为： NoneTypeUtil.BYTE
     * @param data 判断的值
     * @return 如果为空返回true,否则返回false
     */
    public static boolean isNull( byte data){
        if (data == NoneTypeUtil.BYTE)
            return true;
        return false;
    }
    /**
     * 判断被指定的float类型数据是否为空,为空的条件为：NoneTypeUtil.FLOAT
     * @param data 判断的值
     * @return 如果为空返回true,否则返回false
     */
    public static boolean isNull(float data){
        if (data == NoneTypeUtil.FLOAT)
            return true;
        return false;
    }
    /**
     * 判断被指定的double类型数据是否为空,为空的条件为：NoneTypeUtil.DOUBLE
     * @param data 判断的值
     * @return 如果为空返回true,否则返回false
     */
    public static boolean isNull(double data){
        if( data == NoneTypeUtil.DOUBLE)
            return true ;
        return false ;
    }

    /**
     * 判断被指定的double类型数据是否为空,为空的条件为：NoneTypeUtil.DOUBLE
     * @param data 判断的值
     * @return 如果为空返回true,否则返回false
     */
    public static boolean isNull(BigDecimal data){
        if( data == null)
            return true ;
        return false ;
    }

    /**
     * 判断被指定的Date类型数据是否为空,为空的条件为：NoneTypeUtil.DATE
     * @param data 判断的值
     * @return 如果为空返回true,否则返回false
     */
    public static boolean isNull(Date data){
        Date nullDate = NoneTypeUtil.DATE;

        if(data == null || data.compareTo(nullDate) <= 0)
            return true ;
        return false ;
    }

    /**
     *  判断被指定的byte[]类型数据是否为空,为空的条件为：NoneTypeUtil.BYTES
     * @param data 判断的值
     * @return 如果为空返回true,否则返回false
     */
    public static boolean isNull( byte[] data ){

        if( data == NoneTypeUtil.BYTES || data.length == 0 )
            return true ;

        return false ;

    }

    /**
     * 判断指定的数据是否为空
     * @param data 判断的值
     * @return 如果为空返回true ,否则返回false
     */
    public static boolean isNull(Object data){
        if(data == null ) return true ;

        boolean result = false;
        Class<?> type = data.getClass();

        if( type.equals( Integer.class) ){
            result = isNull(ClassTypeUtil.toInt(data));
        }else if( type.equals( Long.class) ){
            result = isNull(ClassTypeUtil.toLong(data));
        }else if( type.equals( Byte.class) ){
            result = isNull(ClassTypeUtil.toByte(data));
        }else if( type.equals( Boolean.class) ){
            result = isNull(ClassTypeUtil.toBoolean(data));
        }else if( type.equals( String.class) ){
            result = isNull(ClassTypeUtil.toString(data));
        }else if( type.equals( Float.class) ){
            result = isNull(ClassTypeUtil.toFloat(data));
        }else if( type.equals( Double.class) ){
            result = isNull(ClassTypeUtil.toDouble(data));
        }else if( type.equals( BigDecimal.class ) ){
            result = isNull( ClassTypeUtil.toDecimal(data) );
        }else if( type.equals( byte[].class) ){
            return isNull( ClassTypeUtil.toBytes(data));
        }else if( type.equals( StringBuffer.class) ){
            return isNullOrEmpty( (StringBuffer)data );
        }else if( type.equals( Collection.class) ){
            return isNullOrEmpty( (Collection<?>)data );
        }else if( type.equals( Map.class) ){
            return isNullOrEmpty( (Map<?,?>)data );
        }

        return result;
    }

    /**
     * 判断指定的数据是否为空
     * @param data 判断的值
     * @return 如果为空返回true ,否则返回false
     */
    public static boolean isNullOrEmpty(Object data){
        if(data == null ) return true ;

        boolean result = false;
        Class<?> type = data.getClass();

        if( type.equals( Integer.class) ){
            result = isNull(ClassTypeUtil.toInt(data));
        }else if( type.equals( Long.class) ){
            result = isNull(ClassTypeUtil.toLong(data));
        }else if( type.equals( Byte.class) ){
            result = isNull(ClassTypeUtil.toByte(data));
        }else if( type.equals( Boolean.class) ){
            result = isNull(ClassTypeUtil.toBoolean(data));
        }else if( type.equals( String.class) ){
            result = isNullOrEmpty(ClassTypeUtil.toString(data));
        }else if( type.equals( Float.class) ){
            result = isNull(ClassTypeUtil.toFloat(data));
        }else if( type.equals( Double.class) ){
            result = isNull(ClassTypeUtil.toDouble(data));
        }else if( type.equals( BigDecimal.class ) ){
            result = isNull( ClassTypeUtil.toDecimal(data) );
        }else if( type.equals( byte[].class) ){
            result = isNull( ClassTypeUtil.toBytes(data));
        }else if( type.equals( StringBuffer.class) ){
            result = isNullOrEmpty( (StringBuffer)data );
        }else if( type.equals( Collection.class) ){
            result = isNullOrEmpty( (Collection<?>)data );
        }else if( type.equals( Map.class) ){
            result = isNullOrEmpty( (Map<?,?>)data );
        }

        return result;
    }

    /**
     * 判断字符串为空或者空字符串
     * @param strValue 判断的值
     * @return 字符串为空或者空字符串返回true,否则返回false
     */
    public static boolean isNullOrEmpty( String strValue){
        if( strValue == null || strValue.equals("") )
            return true ;
        return false ;
    }

    /**
     * 判断动态字符串对象是否为空或者是不包含任何字符
     * @param strValue 判断的值
     * @return 对象为空或者不包含任何字符返回true,否则返回false
     */
    public static boolean isNullOrEmpty( StringBuffer strValue){
        if( strValue == null || strValue.length()== 0 )
            return true ;
        return false ;
    }
    /**
     * 判断Collection类型对象是否为空或者不包含任何元素
     * @param collection 判断的值
     * @return 为空或者未包含元素返回true,否则返回false
     */
    public static boolean isNullOrEmpty(Collection<?> collection){
        if (collection == null || collection.size() == 0)
            return true;
        return false ;
    }
    /**
     * 判断Map类型对象是否为空或者不包含任何元素
     * @param map 判断的值
     * @return 为空或者未包含元素返回true,否则返回false
     */
    public static boolean isNullOrEmpty(Map<?,?> map){
        if (map == null || map.size() == 0)
            return true;
        return false ;
    }

}
